﻿/// <reference path="jquery.js" />
/// <reference path="custom2.js" />
var Calendar={
    curctl: null,
    wrap: null,
    time: false,
    selregion: [new Date().toString("yyyy-MM-dd").ParseDate(),0], //设置可以选择区域,第一个为日期，第二个是连续的天数，为0表示所有
    dateregion: [new Date().getFullYear()-60,new Date().getFullYear()+20],  //日期区域，第一个为起始日期，第一个为连续的年数
    value: new Date(),
    create: function() { },
    show: function() { },
    onselect: function(obj,time) { },
    init: function()
    {
        var _t=this;
        this.wrap=$('<div style="border:solid 1px blue; position:absolute; top:0px; left:0px;background:white; font-size:12px;display:none; padding-top:2px;z-Index:9999"></div>');
        $(document.body).append(this.wrap);

        this.wrap.click(function(e)
        {
            e.stopPropagation();
        });
        $(document).click(function()
        {
            _t.wrap.hide();
        });
        _t.show=function()
        {
            _t.value=_t.curctl.val();
            _t.value=_t.value?_t.value.ParseDate():new Date();
            _t.wrap.show();
            year.empty();
            var sdt=_t.dateregion[0];
            var edt=_t.dateregion[1];
            for(var i=sdt;i<=edt;i++)
            {
                year.append('<option value="'+i+'">'+i+'</option>');
            }
            _t.time?footer.show():footer.hide();
            _t.create();
            var offset=_t.curctl.offset();
            if(offset.top+_t.wrap.outerHeight()>=Math.max($(document.body).height(),$(window).height(),$(document).height()))
            {
                offset.top-=_t.wrap.outerHeight();
            }
            else
            {
                offset.top+=_t.curctl.outerHeight();
            }
            _t.wrap.css(offset);
            setdefval();
        }

        var head=$('<div style="text-align:center;"></div>')
        this.wrap.append(head);

        //上一月
        var upmonth=$('<div style="position:absolute; top:0px; left:0px; cursor:pointer;float:left;padding:3px;">&lt;</div>')
        head.append(upmonth);
        upmonth.click(function()
        {
            _t.value=_t.value.GetPreMonth();
            if(_t.value.getFullYear()<_t.dateregion[0])
            {
                _t.value=_t.value.GetNextMonth();
                return false;
            }
            setdefval();
            _t.create();
        });

        var year=$('<select>');
        head.append(year);

        var month=$('<select>');
        head.append(month);
        for(i=1;i<13;i++)
        {
            month.append('<option value="'+i+'">'+i+'</option>');
        }
        year.change(function()
        {
            _t.value=(year.val()+"-"+month.val()+"-01").ParseDate();
            _t.create();
        });
        month.change(function()
        {
            year.change();
        });

        //设置默认值
        function setdefval()
        {
            year.val(_t.value.getFullYear());
            month.val(_t.value.getMonth()+1);
            hour.val(_t.value.getHours());
            minute.val(_t.value.getMinutes());
            second.val(_t.value.getSeconds());
        }

        //下一月
        var nextmonth=$('<div style="position:absolute; top:0px; right:0px; cursor:pointer;float:left;padding:3px;">&gt;</div>')
        head.append(nextmonth);
        nextmonth.click(function()
        {
            _t.value=_t.value.GetNextMonth();
            if(_t.value.getFullYear()>_t.dateregion[1])
            {
                _t.value=_t.value.GetPreMonth();
                return false;
            }
            setdefval();
            _t.create();
        });

        var table=$('<table style="text-align:center;vertical-align:middle;"><thead><tr><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th><th>日</th></tr></thead></table>');
        this.wrap.append(table);

        var footer=$('<div style="text-align:center;"></div>')
        this.wrap.append(footer);
        footer.hide();
        var hour='<select>';
        for(var i=0;i<24;i++)
        {
            hour+='<option value="'+i+'">'+(i<10?"0":"")+i+'</option>';
        }
        hour+="</select>";
        hour=$(hour);
        footer.append(hour);
        hour.change(function()
        {
            _t.value=new Date(_t.value.setHours(parseInt(this.value)));
            _t.curctl.val(_t.value.toString("yyyy-MM-dd HH:00:00"));
        });
        footer.append("时");

        var minute='<select>';
        for(var i=0;i<60;i++)
        {
            minute+='<option value="'+i+'">'+(i<10?"0":"")+i+'</option>';
        }
        minute+="</select>";
        minute=$(minute);
        footer.append(minute);
        minute.change(function()
        {
            _t.value=new Date(_t.value.setMinutes(parseInt(this.value)));
            _t.curctl.val(_t.value.toString("yyyy-MM-dd HH:mm:00"));
        });
        footer.append("分");

        var second='<select>';
        for(var i=0;i<60;i++)
        {
            second+='<option value="'+i+'">'+(i<10?"0":"")+i+'</option>';
        }
        second+="</select>";
        second=$(second);
        footer.append(second);
        second.change(function()
        {
            _t.value=new Date(_t.value.setSeconds(parseInt(this.value)));
            _t.curctl.val(_t.value.toString("yyyy-MM-dd HH:mm:ss"));
            _t.wrap.hide();
        });
        footer.append("秒");
        var tbody;

        _t.create=function()
        {
            if(tbody)
            {
                tbody.remove();
            }
            tbody=$('<tbody>');
            table.append(tbody);

            var fw=_t.value.GetFirstDayWeek();

            var date=[];
            for(var i=1;i<fw;i++)
            {
                date.push("");
            }
            var day=_t.value.GetMaxDay();
            for(i=1;i<=day;i++)
            {
                date.push(i);
            }
            var len=date.length;
            var tr,td;

            var list=[],curdt,s,e;
            if(_t.selregion[1])
            {
                s=_t.selregion[0].toString("yyyy-MM-dd").ParseDate();
                e=_t.selregion[0].toString("yyyy-MM-dd").ParseDate();
                if(_t.selregion[1]<0)
                {
                    s=new Date(s.setDate(s.getDate()+_t.selregion[1]));
                }
                else
                {
                    e=new Date(e.setDate(e.getDate()+_t.selregion[1]));
                }
            }
            for(i=0;i<len;i++)
            {
                if(i%7==0)
                {
                    tr=$("<tr>");
                    tbody.append(tr);
                }
                td=$('<td style="padding:3px 4px;padding-top:4px; color:#aaaaa1;width:15px;text-align:center;">'+date[i]+'</td>');
                tr.append(td);

                curdt=(_t.value.toString("yyyy-MM-"+date[i])).ParseDate()
                if(date[i]&&(!_t.selregion[1]||curdt>=s&&curdt<=e))
                {
                    td.css({ "cursor": "pointer","color": "black" });
                    list.push(td);
                    td.mousemove(function()
                    {
                        var t=$(this);
                        t.css({ "background": "gray","color": "black" });
                    });
                    td.mouseout(function()
                    {
                        $.each(list,function(i)
                        {
                            var t=$(this);
                            if(_t.value.getDate()==parseInt(t.html()))
                            {
                                t.css({ "background": "red","color": "white" });
                            }
                            else
                            {
                                t.css({ "background": "white","color": "black" })
                            }
                        });
                    });
                    td.click(function()
                    {
                        var d=parseInt(this.innerHTML);
                        _t.value=new Date(_t.value.setDate(d));
                        _t.curctl.val(_t.value.toString("yyyy-MM-dd"+(_t.time?" HH:mm:ss":"")));
                        if(!_t.time)
                        {
                            _t.wrap.hide();
                            _t.curctl.blur();
                            Calendar.onselect(this,_t.time);
                        }
                        $(this).mouseout();
                    });
                }
            }
            td.mouseout();
        }
    }
}
Calendar.init();
$("[calendar]").each(function()
{
    var t=$(this);
    if(!this.value&&t.attr("calendar").match(/^\d{4}/))
    {
        t.val(t.attr("calendar"));
    }
    t.focus(function()
    {
        if(t.attr("selregion"))
        {
            Calendar.selregion=t.attr("selregion").split(",");
            Calendar.selregion[1]=parseInt(Calendar.selregion[1])||0;
        }
        Calendar.time=t.attr("time");
        Calendar.curctl=t;
        Calendar.show();
    });
    t.click(function(e)
    {
        e.stopPropagation();
    });
});